home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Delphi Programmer's Power Pack
/
Delphi Volume 1.iso
/
e_to_l
/
fbuilder
/
delphi
/
demos
/
eis1.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-09-15
|
6KB
|
232 lines
{ FormulaBuilder }
{ YGB Software, Inc. }
{ Copyright 1995 Clayton Collie }
{ All rights reserved }
{ EIS Demo. Demonstrates the inefficiency }
{ of using the usual methods of variable }
{ handling in cases where variable data }
{ is voluminous and changes frequently }
unit Eis1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
StdCtrls, Forms, DBCtrls, DB, DBGrids,SSheet,FBCOMP,FBDBCOMP, Grids,
DBTables, ExtCtrls, Buttons;
type
TForm2 = class(TForm)
DBGrid1: TDBGrid;
DBNavigator: TDBNavigator;
Panel1: TPanel;
DataSource1: TDataSource;
Panel2: TPanel;
Table1: TTable;
Panel3: TPanel;
SSheetGrid: TStringGrid;
GroupBox1: TGroupBox;
ResultPanel: TPanel;
FormulaEdit: TEdit;
BitBtn1: TBitBtn;
SpeedButton1: TSpeedButton;
Expression: TExpression;
procedure FormCreate(Sender: TObject);
procedure SSheetGridGetEditText(Sender: TObject; ACol, ARow: Longint;
var Value: OpenString);
procedure SSheetGridSetEditText(Sender: TObject; ACol, ARow: Longint;
const Value: String);
procedure FormDestroy(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
private
{ private declarations }
Sheet : TSpreadSheet;
ExprInitialized : boolean;
public
{ public declarations }
Expression : TExpression;
Procedure AddVariables;
Procedure UpdateVariables( updateSheetvars : boolean );
end;
var
Form2: TForm2;
implementation
uses fbcalc;
{$R *.DFM}
{
The syntax for "spreadsheet" cell access in RnCn where n is an integer,
for example :
"R1C1 * R2C2 - R5C2"
}
procedure TForm2.FormCreate(Sender: TObject);
var r, c : integer;
tmpstr : String[15];
begin
Sheet := TSpreadSheet.Create(NIL);
ExprInitialized := Expression.Status = EXPR_SUCCESS;
AddVariables;
Table1.Open;
for r := 0 to MAXROWS do
for c := 0 to MAXCOLS do
begin
if (r + c = 0) then continue;
if (r = 0) then
begin
tmpStr := 'C'+IntToStr(c);
SSheetGrid.Cells[c,r] := tmpstr;
end
else
if (c = 0) then
begin
tmpStr := 'R'+IntToStr(r);
SSheetGrid.Cells[c,r] := tmpstr;
end
else
begin
tmpstr := FloatToStrF(Sheet.SheetData[r,c],ffCurrency,10,2);
SSheetGrid.Cells[c,r] := tmpstr;
end;
end;
end;
Procedure TForm2.AddVariables;
var r , c : integer;
tmp : string[10];
begin
{ Add variables to the engine. Note that since our spreadheet }
{ is 10 x 10, we end up adding a total of 117 variables to ONE }
{ INSTANCE. Even so, there is no guarantee that any one of these }
{ variables will be used. }
{ Imagine, also if we needed to link to another table with a different
structure }
if ExprInitialized then
With Expression do begin
AddVariable('SYMBOL',vtSTRING);
AddVariable('CO_NAME',vtSTRING);
AddVariable('CO_NAME',vtSTRING);
AddVariable('CUR_PRICE',vtFLOAT);
AddVariable('YRL_HIGH',vtFLOAT);
AddVariable('YRL_LOW',vtFLOAT);
AddVariable('P_E_RATIO',vtFLOAT);
AddVariable('BETA',vtFLOAT);
AddVariable('PROJ_GRTH',vtFLOAT);
AddVariable('INDUSTRY',vtINTEGER);
AddVariable('PRICE_CHG',vtINTEGER);
AddVariable('SAFETY',vtINTEGER);
AddVariable('RATING',vtSTRING);
AddVariable('RANK',vtINTEGER);
AddVariable('OUTLOOK',vtINTEGER);
AddVariable('RCMNDATION',vtSTRING);
AddVariable('RISK',vtSTRING);
end;
for r := 1 to MAXROWS do
for c := 1 to MAXCOLS do
begin
tmp := 'R'+IntToStr(R)+'C'+IntToStr(c);
Expression.AddVariable( tmp, vtFLOAT );
end;
end;
Procedure TForm2.UpdateVariables( updateSheetVars : Boolean );
var r,c : word;
tmp : string[10];
Procedure UpdateVar(const vname : string);
var tmp : string;
begin
tmp := Table1.FieldByName(vname).AsString;
Expression.StringValues[vname] := tmp;
end;
{ Notice that we may end up having to update all 117 variables, even }
{ though we will at most use only a few of them. As you can imagine, }
{ this can be slow }
begin
UpdateVar('SYMBOL');
UpdateVar('CO_NAME');
UpdateVar('CO_NAME');
UpdateVar('CUR_PRICE');
UpdateVar('YRL_HIGH');
UpdateVar('YRL_LOW');
UpdateVar('P_E_RATIO');
UpdateVar('BETA');
UpdateVar('PROJ_GRTH');
UpdateVar('INDUSTRY');
UpdateVar('PRICE_CHG');
UpdateVar('SAFETY');
UpdateVar('RATING');
UpdateVar('RANK');
UpdateVar('OUTLOOK');
UpdateVar('RCMNDATION');
UpdateVar('RISK');
{ Check to see if we can avoid having to update sheet variables }
if UpdateSheetVars then
for r := 1 to MAXROWS do
for c := 1 to MAXCOLS do
begin
tmp := 'R'+IntToStr(R)+'C'+IntToStr(c);
Expression.StringValues[tmp] := FloatToStr(Sheet.SheetData[r,c]);
end;
end;
procedure TForm2.SSheetGridGetEditText(Sender: TObject; ACol,
ARow: Longint; var Value: OpenString);
begin
Value := FloatToStrF(Sheet.SheetData[ARow,Acol],ffCurrency,10,2);
end;
procedure TForm2.SSheetGridSetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: String);
var temp : double;
begin
Try
Sheet.SheetData[ARow,ACol] := StrToFloat(value);
except
{}
end;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
Expression.Free;
end;
procedure TForm2.SpeedButton1Click(Sender: TObject);
var stringExpr : String;
begin
StringExpr := FormulaEdit.Text;
if StringExpr <> '' then
begin
Expression.Formula := StringExpr;
if Expression.Status <> EXPR_SUCCESS then
begin
MessageBeep( MB_ICONHAND );
ResultPanel.Caption := Expression.StatusText;
end
else
ResultPanel.Caption := Expression.AsString;
end;
end;
procedure TForm2.DataSource1DataChange(Sender: TObject; Field: TField);
begin
UpdateVariables( False );
end;
end.